/**
 * Created by Mr.chen on 2020.10.12
 **/
import axios from 'axios';
import router from '@/router'

// 导入工具类
import { setStore, getStore, encryptionParams } from '@/utils/util';
import { TOKEN } from '@/utils/const';

// ======================== 创建axios实例 ========================
// 配置当前axios实例配置项
const BASE_OPTIONS = {
  // 开发环境与生产环境区分、一般超时时间设置 20s~30s 之间
  baseURL: process.env.BASE_URL,
  timeout: 25000,
}
const instance = axios.create(BASE_OPTIONS);


// =========================== 拦截器 ===========================
// 请求拦截器
instance.interceptors.request.use(
  config => {
    const token = getStore(TOKEN) || "none";
    // 将token夹杂在headers中给到后台
    // config.headers['Token'] = token;
    // TODO: 这边可以配置header传参
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);
// 响应拦截器
instance.interceptors.response.use(
  response => {
    // 判断token是否失效
    if (response.data) {
      if (parseInt(response.data.code) === 4001) {
        // 用户已在别处登录 或者 token已过期 回到登录页面重新登录
        setStore(TOKEN, '')
        router.push({ path: '/' })
      }
    }
    // data: {} 响应主体内容
    return response.data;
  },
  error => {
    let { response } = error;
    if (response) {
      // => 收到服务器返回结果
      let message = "";
      switch (response.status) {
        case 400: // 传递参数错误
          message = "参数有误";
          console.log("400 请检查传递的参数是否有误");
          break;
        case 401: // 用户未登录 => 一般是权限
          break;
        case 403: // 服务器已拒绝 => token过期
          break;
        case 404: // 找不到页面
          break;
      }
      return Promise.reject(message);
    } else {
      // => 未收到服务器返回结果 [客户端断网、服务端挂了]
      if (!window.navigator.onLine) {
        // 断网处理 => 可以跳转到断网页面
        return;
      } else {
        // 服务端挂了...
        return Promise.reject(error);
      }
    }

  }
);


// 几种通用请求方式封装 GET、POST、PUT、DELETE
/**
 * @method GET请求
 * @param {String} URL      请求地址
 * @param {Object} params   url传递参数, 拼接在url之后
 */
export const GET = (URL, params) => instance.get(URL, { params });

/**
 * @method POST请求
 * @param {String} URL      请求地址
 * @param {Object} data     body传递参数
 * @param {Object} params   url传递参数, 拼接在url之后
 * @param {Object} config   请求配置信息
 */
export const POST = (URL, data, params, config) => instance.post(`${URL}`, data, { params, ...config });

/**
 * @method PUT请求
 * @param {String} URL      请求地址
 * @param {Object} data     body传递参数
 * @param {Object} params   url传递参数, 拼接在url之后
 */
export const PUT = (URL, data, params) => instance.put(URL, data, { params });

/**
 * @method DELETE请求
 * @param {String} URL      请求地址
 * @param {Object} data     body传递参数
 * @param {Object} params   url传递参数, 拼接在url之后
 */
export const DELETE = (URL, data, params) => instance.delete(URL, { data, params });

// * PATCH
export const PATCH = (URL, params) => instance.patch(URL, params);


// ======================== 导出让外部使用 ========================
// 导出当前axios实例对象 [默认]
export default instance;
